package src.C_io;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class Demo01 {

    /*
    * io的定义
      存储和读取数据的解决方案
      i：input   o：output
      流：像水流一样传输数据
    * io流的作用：
      用于读写数据（本地文件，网络）
    * io流分类：
      1、按流的方向分为：输入流（读取，ps：文件->程序），输出流（写出，ps：程序->文件）
      2、安装操作文件类型分为：字节流（可以操作所有类型的文件），字符流（只能操作纯文本文件）
          ps：纯文本文件的定义：win自带的记事本打开能读得懂的文件
          * 字节流又分为：InputStream（字节输入流），OutputStream（字节输出流）
          * 字符流又分为：Reader（字符输入流），Writer（字符输出流）
            ps：它们四个都是 抽象类 ，需要继承实现！
    * */

    // 字节输出流的细节
    public static void main(String[] args) throws IOException {
        /*
        1、创建对象
            细节1：参数是字符串表示的路径或者file对象都是可以的
            细节2：如果文件不存在会创建新的文件，但是要保证父级路径是存在的
            细节3：如果文件已经存在，则会清空文件
            细节4：续写，也就是构造方法写第二个参数boolean类型，不传默认为false，如果传true则细节3不成立，会在原来的内容基础上继续写入
        */
        FileOutputStream fileOutputStream = new FileOutputStream("src\\C_io\\a.txt",true);

        /*
        2、写出数据（三种方式）
            write方法参数是整数，但是实际上写到本地文件中是整数在ASCII上对应的字符
            97 --> a；
        */
        fileOutputStream.write(97); // int参数,单字节写入
        fileOutputStream.write(new byte[]{98,99,100}); // byte[]参数，多字节写入
        fileOutputStream.write(new byte[]{97,98,99,100,101,102,103},4,3); // byte[]参数，off下标，len个数，多字节写入
        // 换行
        fileOutputStream.write("\r\n".getBytes()); // 用转义字符换行（ps："\r\n" 回车换行，写 "\n" 也可以，因为底层会自动补全）
        String str = "3.14159265";
        byte[] bytes = str.getBytes(); // 将str转为byte[]
        System.out.println(Arrays.toString(bytes)); // 将bytes转为字符串打印
        fileOutputStream.write(bytes);
        fileOutputStream.write("\r\n".getBytes());

        // 3、释放资源，每次使用完流之后都要释放资源
        fileOutputStream.close();
    }

}
